package com.mmall.example.syncContainer.vector;

import com.mmall.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.Iterator;
import java.util.Vector;


/**
 * Vector 同步容器 - > 在某些情况下会出现线程不安全的现象
 * 不要在foreach，Iterator 上进行更新操作。
 * Created by megan on 2018/4/2.
 */
@Slf4j
@NotThreadSafe
public class VectorExample3 {

    // java.util.ConcurrentModificationException
    private static void test1(Vector<Integer> v1){ //foreach
        for(Integer v : v1){
            if(v.equals(3)){
                v1.remove(v);
            }
        }
    }

    /**  java.util.ConcurrentModificationException **/
    private static void test2(Vector<Integer> v2){ //Iterator
        Iterator<Integer> iterator = v2.iterator();
        while (iterator.hasNext()){
            Integer v = iterator.next();
            if(v.equals(3)){
                v2.remove(v);
            }

        }
    }

    /**  正常执行 **/
    private static void test3(Vector<Integer> v3){ //for
        for(int i = 0 ; i< v3.size() ; i ++){
            if(v3.get(i).equals(3)){
                v3.remove(i);
            }
        }
    }

    public static void main(String[] args) {
        Vector<Integer> vector = new Vector<>();
        vector.add(1);
        vector.add(2);
        vector.add(3);

        /**  java.util.ConcurrentModificationException **/
        //test1(vector);

        /**  java.util.ConcurrentModificationException **/
        //test2(vector);

        test3(vector);
    }

}
